package edu.huangke;

import edu.huangke.dao.UserDao;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class MyProxy implements InvocationHandler {

    private UserDao userDao;


    public Object createProxy(UserDao userDao){
        this.userDao = userDao;

        // 创建 jdk 的动态代理对象需要 3个参数 类加载器， 被代理对象实现的接口，处理器（增强功能的具体实现）
        ClassLoader classLoader = this.getClass().getClassLoader();
        Class<?>[] interfaces = userDao.getClass().getInterfaces();
        // 创建动态代理对象
        Object proxy = Proxy.newProxyInstance(classLoader, interfaces, this);
        return proxy;
    }

    /**
     * @param proxy 代理对象本身
     * @param method 将要增强的方法
     * @param args   方法的参数
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        // 创建 增强类对象
        MyAspect myAspect = new MyAspect();
        myAspect.checkPermission();// 权限校验 增强

        // 保证 原方法执行
        Object result = method.invoke(userDao, args);

        // 日志增强
        myAspect.log();

        return result;
    }
}
